package in.controller.adapter.base; import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.BaseAdapter; import android.widget.ListView; import in.data.stream.base.Stream; import in.lib.view.LinkedTextView; import in.model.AdnModel; import in.view.delegate.base.AdapterDelegate; import lombok.Getter; import lombok.Setter; public abstract class RobinAdapter<T extends AdnModel> extends BaseAdapter implements OnItemLongClickListener { @Getter private Context context; @Getter private SparseArray<AdapterDelegate<T>> itemTypes = new SparseArray<AdapterDelegate<T>>(); @Getter protected Stream<T> stream; @Setter protected PageListener pageListener; @Getter private ListView listView; @Getter private int pageCount = 60; public static interface PageListener { public void onEndReached(); } public RobinAdapter(Context context) { this.context = context; } public void setStream(Stream<T> stream) { this.stream = null; this.stream = stream; } @Override public boolean isEmpty() { return this.stream == null || (this.stream != null && this.stream.getItems().size() < 1); } /** * Appends the stream object with new items and updates the {@link in.data.Meta#minId} and {@link in.data.Meta#moreAvailable} * members. * @param stream */ public void appendStream(Stream stream) { if (stream == null) { setStream(stream); } else { this.stream.getItems().addAll(stream.getItems()); this.stream.getMeta().setMinId(stream.getMeta().getMinId()); this.stream.getMeta().setMoreAvailable(stream.getMeta().isMoreAvailable()); } } public void addItem(T item) { if (stream != null) { this.stream.getItems().add(item); this.stream.getMeta().setMinId(item.getId()); } } public int indexOf(T item) { for (int index = 0, count = getCount(); index < count; index++) { if (getItem(index).equals(item)) { return index; } } return -1; } public void setListView(ListView list) { this.listView = list; this.listView.setOnItemLongClickListener(this); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (pageListener != null) { int trigger = getCount() - (pageCount / 2); if (trigger >= pageCount / 2 && position >= trigger) { pageListener.onEndReached(); } } int viewType = getItemViewType(position); T item = (T)getItem(position); convertView = getItemTypes().get(viewType).getView(item, position, convertView, parent, LayoutInflater.from(getContext())); return convertView; } @Override public int getViewTypeCount() { return itemTypes.size(); } @Override public boolean hasStableIds() { return true; } @Override public int getCount() { if (this.stream != null && this.stream.getItems() != null) { return this.stream.getItems().size(); } return 0; } @Override public T getItem(int position) { if (this.stream != null && this.stream.getItems() != null) { return this.stream.getItems().get(position); } return null; } @Override public long getItemId(int position) { if (this.stream != null && this.stream.getItems() != null) { try { return Long.parseLong(getItem(position).getId()); } catch (NumberFormatException e){} } return 0L; } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { // weird conflicts with LinkifiedTextView on Jelly Bean if (view instanceof LinkedTextView) { return false; } int viewType = getItemViewType(position - getListView().getHeaderViewsCount()); boolean ret = getItemTypes().get(viewType).onItemLongClick(position, view); return ret; } }